// Rust 宏是“卫生”的，并且比仅执行简单的字符串替换和扩展更具有识别上下文环境的能力。
// 它们知道宏中引用的变量的作用域，并且不会隐藏已经在外部声明的任何标识符。
macro_rules! switch {
    ($a:expr, $b:expr) => {
        // cannot find value `temp` in this scope
        let temp = $b; $b = $a; $a = temp;
    };
}

fn main() {
    let mut x = 1;
    let mut y = 2;
    let _temp = 3;
    switch!(x, y);

    println!("{x}");
    println!("{y}");
}
